package com.kurt.util;

import com.kurt.entity.SysUserDataPermission;
import com.kurt.repository.SysUserDataPermissionRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 数据权限工具类
 * 提供通用的数据权限查询和过滤功能
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class DataPermissionUtil {

    private final SysUserDataPermissionRepository dataPermissionRepository;

    /**
     * 获取用户对指定实体类型的资源权限ID列表
     *
     * @param userId         用户ID
     * @param entityTypeName 实体类型名称（如：vehicle, driver）
     * @return 有权限的资源ID列表
     */
    public List<Long> getUserResourceIds(Long userId, String entityTypeName) {
        try {

            // 查询用户对该实体类型的权限
            List<SysUserDataPermission> permissions = dataPermissionRepository
                    .findByUserIdAndEntityType(userId, entityTypeName);

            return permissions.stream()
                    .map(SysUserDataPermission::getResourceId)
                    .collect(Collectors.toList());
        } catch (Exception e) {
            log.error("获取用户资源权限失败: userId={}, entityTypeName={}", userId, entityTypeName, e);
            return List.of();
        }
    }

    /**
     * 检查用户是否有指定资源的权限
     *
     * @param userId         用户ID
     * @param entityTypeName 实体类型名称
     * @param resourceId     资源ID
     * @return 是否有权限
     */
    public boolean hasResourcePermission(Long userId, String entityTypeName, Long resourceId) {
        try {

            // 检查权限是否存在
            return dataPermissionRepository.existsByUserIdAndEntityTypeAndResourceId(
                    userId, entityTypeName, resourceId);
        } catch (Exception e) {
            log.error("检查用户资源权限失败: userId={}, entityTypeName={}, resourceId={}",
                    userId, entityTypeName, resourceId, e);
            return false;
        }
    }

    /**
     * 获取用户有权限的资源ID列表（用于IN查询）
     * 如果用户没有任何权限，返回空列表
     *
     * @param userId         用户ID
     * @param entityTypeName 实体类型名称
     * @return 有权限的资源ID列表，如果为空则用户无任何权限
     */
    public List<Long> getAuthorizedResourceIds(Long userId, String entityTypeName) {
        List<Long> resourceIds = getUserResourceIds(userId, entityTypeName);

        // 如果用户没有任何权限，返回包含-1的列表，这样IN查询会返回空结果
        if (resourceIds.isEmpty()) {
            return List.of(-1L);
        }

        return resourceIds;
    }
}
